#pragma once
#include "AudioCapture.h"
#ifdef __cplusplus
extern "C"
{
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavutil/avutil.h"
#include "libswscale/swscale.h"
#include "libavutil/opt.h"
#include "libavutil/imgutils.h"
};
#endif
namespace AAC_CODER {
	class AACAudioCoder :public CaptureAudio::CaptureAudioObserver {
	public:
		class EncodeAudioObserver {
		public:
			virtual void OnAudioEncode(const void *frameaddress, uint32_t framelen,uint16_t pts) {};
		};
		enum CAP_STATUS {
			RUNNING = 1,
			STOP = 2,
			PAUSE = 3,
			READY = 4,
			UNREADY = 5,
			FAIL = 6,
		};
		void OnAudioData(const void *frameaddress, uint32_t framelen);
		AACAudioCoder(unsigned int smprate, unsigned int channel);
		~AACAudioCoder();
		int Encode(unsigned char *input, unsigned int num);
		int SetObserver(EncodeAudioObserver *);
	private:
		unsigned int mpts;
		CAP_STATUS mStatus;
		unsigned long	mSampleRate = 44100;
		unsigned int	mChannels = 2;
		unsigned int	mPCMBitSize = 16;
                uint8_t*	mAACBuffer;
		unsigned long  nMaxOutputBytes;
		uintptr_t mFablaAacenc;
		AVCodec *mCodec;
		AVCodec *pCodec;
		AVCodecContext *mCodecCtx = NULL;
		AVFrame *mFrame;
		AVPacket pkt;
		uint8_t* mFrameBuf;
		uint16_t mPts;
		EncodeAudioObserver *mObserver;
	};
}
